package com.yanxu.design01_singleton.lazy;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/4/9-2025
 * @Description: 静态内部类的形式构建单例模式
 *  不允许其他线程看到重排序
 */
public class Lazy04_StaticInnerClassSingleton {

    /*
     * 静态内部类，外部类类加载的时候，内部类是不会被加载的
     * 静态内部类保证单例，其实是利用了 内类加载的时候创建单例对象，类加载又是有锁控制的。
     * */

    //构造方法私有化
    private Lazy04_StaticInnerClassSingleton() {
    }

    private static class InnerClass {
        private static Lazy04_StaticInnerClassSingleton staticInnerClassSingleton = new Lazy04_StaticInnerClassSingleton();
    }

    public static Lazy04_StaticInnerClassSingleton getInstance() {
        return InnerClass.staticInnerClassSingleton;
    }

    /*
     * 类的加载遵循的是按需加载的。并不会一上来就全部加载。
     * 类初始化：假如有一个类A
     * 1：A类型的实例创建。此时会初始化A类
     * 2：A类中声明的静态方法被调用
     * 3：A类中声明的静态成员被赋值
     * 4：A类中声明的静态成员被使用，并且成员不是常量成员。
     * 5：一个类是一个顶级类，并且类中有嵌套的断言语句
     * */


    /*
    * class.forName("com.yanxu.singleton.lazy.Lazy04_StaticInnerClassSingleton")
    * 此时单例对象不会被创建的。因为内部类的加载是单独创建的。
    *
    * 因此，只有调用 getInstance() 方法的时候，单例对象才会被创建。
    *
    * */
}